ADO.NET DataReader klasse
Home

ADO.NET DataReader klasse

ADO.NET DataReader klasse

In dat lesonderdeel leren we hoe we gegevens uit de database kunnen inlezen met behulp van de DataReader klasse

Doelstellingen

Inleiding

De DataReader klasse leest gegevens uit de database in op de meest efficiënte manier. Je kan de DataReader “niet” gebruiken om gegevens te wijzigen. Eigenlijk kan je het wel door gebruik te maken van een Command klasse. DataReaders zijn uiterst snelle, alleen voorwaarts, lezende stromen van gegevens.

Je kan gegevens uit een DataReader alleen op een sequentieel voorwaartse manier lezen. Als je gegevens inleest moet je ze ergens opslaan want je kunt ze niet nogmaals lezen, tenzij je een nieuw DataReader object maakt.

Hierarchie DataReader klasse
Hierarchie DataReader klasse

Het alleen voorwaarts design van de DataReader maakt de DataReader supersnel. De DataReader wordt niet vertraagd door de overlast van weg en weer tussen gegevens te navigeren en ze te updaten. De DataReader dient dus alleen voor het eenmaal lezen van gegevens. Ook als het aantal gegevens die je nodig hebt groter is dan het beschikbare interne geheugen is de DataReader de beste keuze.

Een DataReader object maken

Een instantie maken van een DataReader klasse verschilt van andere klasse in ADO.NET. Je moet de ExecuteReader() gebruiken van het Command object gebruiken:

SqlDataReader dr = command.ExecuteReader()

De ExecuteReader() methode van het Command object retourneert een instantie van een DataReader klasse. Een DataReader maken het new sleutelwoord haalt helemaal niets uit. Het Command object verwijst naar het Connection object en bevat het SQL statement die door het DataReader object wordt gebruikt om gegevens op te vragen.

Gegevens inlezen

We weten al de een DataReader object gegevens retourneert als een sequentiële stroom. Om die gegevens nu uit het DataReader object te halen lees je rij per rij in. Als een rij is ingelezen, is de vorige rij niet meer beschikbaar. Als je de vorige rij opnieuw wilt inlezen moet je een nieuwe instantie van de DataReader maken.

Meestal worden de rijen één per één ingelezen met behulp van een while lus.

Let op de Read() methode van het DataReader object in de test conditie van de while lus. De retourwaarde van Read() is van het bool type en is true zolang er nog rijen te lezen zijn. Nadat de laatste rij gelezen is retourneer Read() false en wordt de while lus beëindigd. Je kan verschillende indexers gebruiken om de kolommen van een rij te benaderen.

string indexer

book.Firstname = dr["Firstname"].ToString();
book.Lastname = dr["Lastname"].ToString();
book.Title = dr["Title"].ToString();
book.Publisher = dr["Publisher"].ToString();
book.City = dr["City"].ToString();
book.PublicationYear = dr["PublicationYear"].ToString();
book.ReprintYear = dr["ReprintYear"].ToString();
book.Comment = dr["Comment"].ToString();
book.ISBN13 = dr["ISBN13"].ToString();

int indexer

Je kan de kolommen ook opvragen door gebruik te maken van een indexcijfer van de DataReader:

// je kan int indexers gebruiken
book.Firstname = dr[0].ToString();
book.Lastname = dr[1].ToString();
book.Title = dr[2].ToString();
book.Publisher = dr[3].ToString();
book.City = dr[4].ToString();
book.PublicationYear = dr[5].ToString();
book.ReprintYear = dr[6].ToString();
book.Comment = dr[7].ToString();
book.ISBN13 = dr[8].ToString();

Item collectie van de DataReader

Je kan gegevens uit een DataReader ook halen met de eigenschap Item, waarbij u de naam van de gevraagde kolom of een kolomindex doorgeeft. De eigenschap Item stuurt een basisobjectklasse terug die de waarde van de gevraagde kolom in de huidige rij vertegenwoordigt. U kunt op deze manier een kolom een naam geven, maar er wordt geen strong typing gebruikt. In het gunstigste geval wordt er een verwijzing naar een instantie van een objectklasse teruggestuurd die vervolgens wordt geconverteerd naar het juiste type.

OleDbDataReader myReader = cmdBoeken.ExecuteReader()
while myReader.Read()
{
   Console.WriteLine("\t{0}\t{1}\t{2}", 
      myReader.Item(0), myReader.Item(1), myReader.Item(2))
}

De Item methode kan ook overloaded worden, in plaats van een index geeft u de kolomnaam door:

OleDbDataReader myReader = cmdBoeken.ExecuteReader() 
while myReader.Read() 
{ 
   Console.WriteLine("\t{0}\t{1}\t{2}", 
      myReader.Item("ID"), myReader.Item("Voornaam"), myReader.Item("Naam"))
}

De DataReader sluiten

Net zoals het Connection object, moet je ook het DataReader object sluiten. Stop de code in een try blok en sluit het DataReader object af in het finally blok of gebruik using.

Mijn voorkeur voor de DataReader gaat uit naar using:

using (SqlDataReader dr = command.ExecuteReader())
{
   while (dr.Read())
   {
      ...
   }
}

JI
2017-01-21 16:24:44